home *** CD-ROM | disk | FTP | other *** search
/ Openstep 4.2 (Developer) / Openstep Developer 4.2.iso / NextDeveloper / Source / GNU / uucp / Uucp.framework / uuconf.subproj / paramc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-09  |  4.6 KB  |  176 lines

  1. /* paramc.c
  2.    Handle protocol-parameter commands.
  3.  
  4.    Copyright (C) 1992 Ian Lance Taylor
  5.  
  6.    This file is part of the Taylor UUCP uuconf library.
  7.  
  8.    This library is free software; you can redistribute it and/or
  9.    modify it under the terms of the GNU Library General Public License
  10.    as published by the Free Software Foundation; either version 2 of
  11.    the License, or (at your option) any later version.
  12.  
  13.    This library is distributed in the hope that it will be useful, but
  14.    WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.    Library General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU Library General Public
  19.    License along with this library; if not, write to the Free Software
  20.    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  21.  
  22.    The author of the program may be contacted at ian@airs.com or
  23.    c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
  24.    */
  25.  
  26. #include "uucnfi.h"
  27.  
  28. #if USE_RCS_ID
  29. const char _uuconf_paramc_rcsid[] = "$Id: paramc.c,v 1.5 1995/06/21 19:23:41 ian Rel $";
  30. #endif
  31.  
  32. #include <errno.h>
  33.  
  34. /* Handle protocol-parameter commands by inserting them into an array
  35.    of structures.  The return value may include UUCONF_CMDTABRET_KEEP
  36.    and UUCONF_CMDTABRET_EXIT, if appropriate.  */
  37.  
  38. int
  39. _uuconf_iadd_proto_param (qglobal, argc, argv, pqparam, pblock)
  40.      struct sglobal *qglobal;
  41.      int argc;
  42.      char **argv;
  43.      struct uuconf_proto_param **pqparam;
  44.      pointer pblock;
  45. {
  46.   struct uuconf_proto_param *q;
  47.   size_t c;
  48.   struct uuconf_proto_param_entry *qentry;
  49.  
  50.   if (argc < 2)
  51.     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
  52.  
  53.   /* The first argument is the protocol character.  */
  54.   if (argv[0][1] != '\0')
  55.     return UUCONF_SYNTAX_ERROR | UUCONF_CMDTABRET_EXIT;
  56.  
  57.   if (*pqparam == NULL)
  58.     {
  59.       *pqparam = ((struct uuconf_proto_param *)
  60.           uuconf_malloc (pblock,
  61.                  2 * sizeof (struct uuconf_proto_param)));
  62.       if (*pqparam == NULL)
  63.     {
  64.       qglobal->ierrno = errno;
  65.       return (UUCONF_MALLOC_FAILED
  66.           | UUCONF_ERROR_ERRNO
  67.           | UUCONF_CMDTABRET_EXIT);
  68.     }
  69.       (*pqparam)[1].uuconf_bproto = '\0';
  70.       q = *pqparam;
  71.       q->uuconf_bproto = argv[0][0];
  72.       q->uuconf_qentries = NULL;
  73.     }
  74.   else
  75.     {
  76.       c = 0;
  77.       for (q = *pqparam; q->uuconf_bproto != '\0'; q++)
  78.     {
  79.       if (q->uuconf_bproto == argv[0][0])
  80.         break;
  81.       ++c;
  82.     }
  83.  
  84.       if (q->uuconf_bproto == '\0')
  85.     {
  86.       struct uuconf_proto_param *qnew;
  87.  
  88.       qnew = ((struct uuconf_proto_param *)
  89.           uuconf_malloc (pblock,
  90.                  ((c + 2)
  91.                   * sizeof (struct uuconf_proto_param))));
  92.       if (qnew == NULL)
  93.         {
  94.           qglobal->ierrno = errno;
  95.           return (UUCONF_MALLOC_FAILED
  96.               | UUCONF_ERROR_ERRNO
  97.               | UUCONF_CMDTABRET_EXIT);
  98.         }
  99.  
  100.       memcpy ((pointer) qnew, (pointer) *pqparam,
  101.           c * sizeof (struct uuconf_proto_param));
  102.       qnew[c + 1].uuconf_bproto = '\0';
  103.  
  104.       uuconf_free (pblock, *pqparam);
  105.       *pqparam = qnew;
  106.  
  107.       q = qnew + c;
  108.       q->uuconf_bproto = argv[0][0];
  109.       q->uuconf_qentries = NULL;
  110.     }
  111.     }
  112.  
  113.   if (q->uuconf_qentries == NULL)
  114.     {
  115.       qentry = ((struct uuconf_proto_param_entry *)
  116.         uuconf_malloc (pblock,
  117.                    2 * sizeof (struct uuconf_proto_param_entry)));
  118.       if (qentry == NULL)
  119.     {
  120.       qglobal->ierrno = errno;
  121.       return (UUCONF_MALLOC_FAILED
  122.           | UUCONF_ERROR_ERRNO
  123.           | UUCONF_CMDTABRET_EXIT);
  124.     }
  125.  
  126.       qentry[1].uuconf_cargs = 0;
  127.       q->uuconf_qentries = qentry;
  128.     }
  129.   else
  130.     {
  131.       struct uuconf_proto_param_entry *qnewent;
  132.  
  133.       c = 0;
  134.       for (qentry = q->uuconf_qentries; qentry->uuconf_cargs != 0; qentry++)
  135.     ++c;
  136.  
  137.       qnewent = ((struct uuconf_proto_param_entry *)
  138.          uuconf_malloc (pblock,
  139.                 ((c + 2) *
  140.                  sizeof (struct uuconf_proto_param_entry))));
  141.       if (qnewent == NULL)
  142.     {
  143.       qglobal->ierrno = errno;
  144.       return (UUCONF_MALLOC_FAILED
  145.           | UUCONF_ERROR_ERRNO
  146.           | UUCONF_CMDTABRET_EXIT);
  147.     }
  148.  
  149.       memcpy ((pointer) qnewent, (pointer) q->uuconf_qentries,
  150.           c * sizeof (struct uuconf_proto_param_entry));
  151.       qnewent[c + 1].uuconf_cargs = 0;
  152.  
  153.       uuconf_free (pblock, q->uuconf_qentries);
  154.       q->uuconf_qentries = qnewent;
  155.  
  156.       qentry = qnewent + c;
  157.     }
  158.  
  159.   qentry->uuconf_cargs = argc - 1;
  160.   qentry->uuconf_pzargs = (char **) uuconf_malloc (pblock,
  161.                            ((argc - 1)
  162.                             * sizeof (char *)));
  163.   if (qentry->uuconf_pzargs == NULL)
  164.     {
  165.       qglobal->ierrno = errno;
  166.       qentry->uuconf_cargs = 0;
  167.       return (UUCONF_MALLOC_FAILED
  168.           | UUCONF_ERROR_ERRNO
  169.           | UUCONF_CMDTABRET_EXIT);
  170.     }
  171.   memcpy ((pointer) qentry->uuconf_pzargs, (pointer) (argv + 1),
  172.       (argc - 1) * sizeof (char *));
  173.  
  174.   return UUCONF_CMDTABRET_KEEP;
  175. }
  176.